Java 中的线程创建的方式(二)

上篇文章中介绍了线程创建的第一种方法,本文主要介绍线程的第二种创建方式,并通过实例带大家理解线程创建的另外一种方法。

线程的创建,启动方式二

线程创建的第二种方法是实现 Runnable 接口
先上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1 public class TestThread001 implements Runnable{//创建了一个普通的类TestThread001,实现Runnable接口,具备争抢资源的能力,即多线程的能力。
2 //实现接口后,就要重写里面的抽象方法 run,run 方法里面的内容就是线程体
3 @Override
4 public void run() {
5 for (int i = 1; i <=10; i++) {
6 System.out.println(i);
7 }
8 }
9 }
10 public class Test {
11 public static void main(String[] args) {
12 TestThread001 tt=new TestThread001();//创建了一个线程对象。
13 //tt.start();
14 Thread t=new Thread(tt);
15 t.setName("线程Test--");
16 t.start();
17 for (int i = 1; i <=10; i++) {
18 System.out.println(Thread.currentThread().getName()+i);
19 }
20 }
21 }

现在就来解释一下这段代码:

第 1 至 9 行代码只是表示创建了一个普通的类 TestThread001,然后该类实现了 Runnable 接口,具备了多线程的能力。和第一种方法类似,实现了 Runnable 接口之后也需要重写 run 方法。

第 12 行表示创建了一个线程对象 tt,但此时它只是一个普通的对象而已。此时,如果再执行 tt.start() 语句,你就会发现 tt 根本没有 start() 方法。但是,启动一个线程又必须调用它的 start() 方法。怎么办?

首先我们要知道的是, start() 方法是属于 Thread 类的,所以需要根据 Thread 类创建一个对象 t,调用这个对象的 start() 方法把 tt 线程启动起来。那这个 Thread 对象怎么才能和线程对象联系起来呢?答案就是通过构造器,所以就有了第 14 行代码(我应该表达清楚了吧)。然后第 15 行给线程起名字,第 16 行,调用 t 的 start() 方法启动线程 tt。

这段代码就是线程创建并启动的第二种标准方法,应该不难理解。

这段代码的运行结果如下:
运行结果

这段代码也表明这两个线程在微观上是交替运行的。

那么这两种创建线程的方式哪种好呢?
答案是第二种方法好,即实现 Runnable 方法更好。因为在Java中只能单继承,一个类继承了 Thread 类之后就不能再继承其他的类了,而一个类却可以多实现,实现不同的接口,所以第二种方法比第一种更好。